#include "MTF.h"

bool mi_destruir (tdatol dato) {
	free(dato);
	return true;
}

void comprimir_mtf(tcola *r, unsigned char *vec_ult_col, int tamanio_vec) {
	int *dato;
	tlista lcaracteres;
	tlista_iter iter;
	crear_lista(&lcaracteres);
	int i, j;
	for (i = 255; i >= 0; i--) {
		int *j = (int*) malloc(sizeof(int));
		*j = i;
		insertar_lista_primero(&lcaracteres, j);
	}
	for (i = 0; i < tamanio_vec; i++) {
		j = 0;
		crear_lista_iter(&lcaracteres, &iter);
		while (!lista_iter_final(&iter)) {
			ver_lista_actual(&iter, (void**)&dato);
			if ( *dato == (int)vec_ult_col[i]) {
				borrar_lista(&lcaracteres, &iter, (tdatol*)&dato);
				insertar_lista_primero(&lcaracteres, dato);
				int *k = (int*) malloc (sizeof(int));
				*k = j;
				insertar_cola(r, k);
				break;
			}
			j++;
			avanzar_lista_iter(&iter);
		}
	}
	destruir_lista(&lcaracteres, mi_destruir);
}

void descomprimir_mtf(unsigned char *vec_ult_col, tcola *r) {
	int *dato;
	tlista lcaracteres;
	tlista_iter iter; 
	crear_lista(&lcaracteres);
	int i, j;
	for (i = 255; i >= 0; i--) {
		int *j = (int*) malloc(sizeof(int));
		*j = i;
		insertar_lista_primero(&lcaracteres, j);
	}
	for (i = 0; borrar_cola(r, (tdatoc*)&dato); i++) {
		crear_lista_iter(&lcaracteres, &iter);
		for(j = 0; j < *dato; j++) 
			avanzar_lista_iter(&iter);
		borrar_lista(&lcaracteres, &iter, (tdatol*)&dato);
		insertar_lista_primero(&lcaracteres, dato);
		vec_ult_col[i] = *dato;
	}
	destruir_lista(&lcaracteres, mi_destruir);
}
